﻿/** 
 * Copyright (c) 2001 University of Maryland, College Park, MD 20742, USA
 * Copyright (c) 2005 In4Arch
 *
 *  The MIT License
 *  Permission is hereby granted, free of charge, to any person obtaining a copy of this 
 *  software and associated documentation files (the "Software"), to deal in the Software 
 *  without restriction, including without limitation the rights to use, copy, modify, merge, 
 *  publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
 *  to whom the Software is furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in all copies 
 *  or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 *  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
 *  PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 *  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
 *  CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
 *  OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: Benjamin B. Bederson and Martin Wattenberg 2001 
 * http://www.cs.umd.edu/hcil/treemap-history/index.shtml
 * 
 * Author: moedusa moedusa@gmail.com 2005
 * http://moedusa.name/
 *
 * Author: Nikita Shlyakhov shlyakhov@mail.ru 2006
 **/

 
 import in4arch.alg.treemap.MapModel; 

/** 
 *
 * Object that can measure to the amount of
 * structural change between two layouts.
 * The layouts must have identical tree structures.
 * <p>
 * To measure a difference, first do a "recordLayout" on a MapModel,
 * then call "averageDistance" on the changed model.
 *
 */
class in4arch.alg.treemap.LayoutDifference {
	
    private var old:Array;
    
    public function recordLayout(model:MapModel):Void{
        _recordLayout(model.getItems());
    }
    
    public function _recordLayout(m:Array):Void{
        old = null;
        if (m==null) return;
        old = new Array[m.length];
        for (var i=0; i < m.length; i++)
            old[i]=m[i].getBounds().copy();
    }
    
    public function averageDistance(model:MapModel):Number {
        return _averageDistance(model.getItems());
    }
    
    public function _averageDistance(m:Array):Number {
        var d:Number = 0;
        var n:Number = m.length;
        if (m == null || old == null || n != old.length) {
            trace("Can't compare models.");
            return 0;
        }
		
        for (var i=0; i<n; i++){
            d+=old[i].distance(m[i].getBounds());
		}
        return d/n;
    }
}